﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace CoreCommon
{
    /// <summary>
    /// Класс содержит функционал для записи сообщения в лог файл.
    /// </summary>
    /// <remarks>Файл лога формируется автоматически, при создании первой записи. Файл лога располагается в директории установки программы и 
    /// имеет то же наименование, что и исполняемый файл, за исключением расширения. Расшиирение файла - .log</remarks>
    public static class Log
    {
        /// <summary>
        /// Метод для записи сообщения в лог-файл приложения. Лог файл приложения создается автоматически, при первом обращении, в катаологе установки программы.
        /// Файл лога имеет такое же название как и выполняемая программа, но с расширением ".log"
        /// </summary>
        /// <param name="data"></param>
        public static void ToLog(string data)
        {
            try
            {
                using (FileStream fileStream = new FileStream(
                        Const.LOG_PATH,
                        FileMode.Append,
                        FileAccess.Write,
                        FileShare.None))
                {
                    using (StreamWriter streamWriter = new StreamWriter(fileStream))
                    {
                        StringBuilder strBuild = new StringBuilder("");
                        if (String.IsNullOrEmpty(data))
                            strBuild.Append(" ");
                        else
                            strBuild.Append(DateTime.Now.ToString() + "\t");
                        streamWriter.WriteLine(strBuild.ToString() + data);
                    }
                }
            }
            catch
            {
                return;
            }
        }

        /// <summary>
        /// Функция записи в файл. Значение stringValue записывается в конец файла fileName
        /// </summary>
        /// <param name="stringValue">Строковое значение, которое нужно сохранить в файле fileName</param>
        /// <param name="fileName">Имя файла, в конец которого дописывается занчение stirngValue</param>
        public static void ToFile(string stringValue, string fileName)
        {
            try
            {
                using (FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    using (StreamWriter streamWriter = new StreamWriter(fileStream))
                    {
                        streamWriter.WriteLine(stringValue);
                    }
                }
            }
            catch
            {
                return;
            }
        }

        /// <summary>
        /// Считывает настройки из файла настроек и сохраняет их в списке.
        /// Для корректного считывания, файл должен иметь определенную структуру:
        /// данные записываются без пропусков, в формате: Имя_ключа=значение
        /// Без пропусков и отступов. 
        /// </summary>
        /// <returns>Возвращается список параметров настроек</returns>
        public static Dictionary<string, string> ReadConfig()
        {
            try
            {
                using (StreamReader sr = new StreamReader(CoreCommon.Const.SETTING_PATH))
                {
                    Dictionary<string, string> dic = new Dictionary<string, string>();
                    
                    string line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        string[] str = line.Split('=');
                        dic.Add(str[0], str[1]);
                    }
                    return dic;
                }
            }
            catch (Exception e)
            {
                throw new CoreException(ErrType.Message, e.Message);
            }
        
        }
    }
}
